home *** CD-ROM | disk | FTP | other *** search
- --
- -- Program : Parser.ada
- -- Purpose : This program implements a recursive descent parser. It is
- - based on the recursive descent parser given in Aho, Sethi,
- -- and Ullman, "Principles, Techniques and Tools",
- -- Addison-Wesley, 1986. Note that symbols are limited to
- -- a single character.
- --
- -- To use with GWUMON : To use this program with GWUMON, from the command
- -- line type:
- -- adacomp -a -b -mparse_expr parser.ada
- -- gwumon -mparse_expr
- --
- -- Take the default options on the first screen (speed = 6, exceptions = yes,
- -- and tasks = no) by hitting the "Esc" key. Take the defaults
- -- on the second screen by hitting the "Esc" key.
- --
- -- The purpose of this program is to show recursion, and how in showing that
- -- recursion the parse tree can be represented.
- --
- WITH Text_IO; USE Text_IO;
- PACKAGE Parser IS
- PROCEDURE Lex;
- PROCEDURE Expr;
- PROCEDURE Factor;
- PROCEDURE Parse;
- PROCEDURE Term;
- PRIVATE
- Token : CHARACTER;
- Token_Type : CHARACTER;
- END;
-
- PACKAGE BODY Parser IS
-
- PROCEDURE Lex IS
- BEGIN
- LOOP
- IF NOT End_Of_Line THEN
- GET( Token );
- IF Token /= ' ' THEN
- CASE Token IS
- WHEN '+' | '-' =>
- Token_Type := 'A';
- WHEN '*' | '/' =>
- Token_Type := 'M';
- WHEN OTHERS =>
- Token_Type := 'I';
- END CASE;
- EXIT;
- END IF;
- ELSE
- Token_Type := ' ';
- Token := ' ';
- EXIT;
- END IF;
- END LOOP;
- END Lex;
-
- PROCEDURE Factor IS
- Save_Token : CHARACTER;
- BEGIN
- IF Token = '(' THEN
- Lex;
- Expr;
- IF Token /= ')' THEN
- PUT_LINE(" ");
- PUT_LINE( "Error, ')' expected, tossing token" );
- ELSE
- Lex;
- END IF;
- ELSE
- IF Token_Type = 'I' THEN
- PUT( Token );
- Lex;
- ELSE
- PUT_LINE(" ");
- PUT( "Error, identifier expected, got ");
- PUT( Token );
- New_Line;
- END IF;
- END IF;
-
- END Factor;
-
- PROCEDURE Term IS
- Save_Token : CHARACTER;
- BEGIN
- Factor;
- LOOP
- IF Token = '*' OR Token = '/' THEN
- Save_Token := Token;
- Lex;
- Factor;
- PUT( Save_Token );
- ELSE
- Exit;
- END IF;
- END LOOP;
- END TERM;
-
-
- PROCEDURE Parse IS
- BEGIN
- Lex;
- Expr;
- END Parse;
-
- PROCEDURE Expr IS
- Save_Token : CHARACTER;
- BEGIN
- Term;
- LOOP
- IF Token = '+' OR Token = '-' THEN
- Save_Token := Token;
- Lex;
- Term;
- PUT( Save_Token );
- ELSE
- EXIT;
- END IF;
- END LOOP;
- END Expr;
-
- END Parser;
-
-
- WITH Text_IO; USE Text_IO;
- WITH Parser; USE Parser;
- PROCEDURE Parse_Expr IS
- BEGIN
-
- PUT_LINE( "Enter an equation to be parsed " );
- Parse;
-
- END Parse_Expr;
-
-